package org.ufpe.cin.ip.projeto.Negocios;

import java.io.IOException;
import java.util.Random;

import jxl.read.biff.BiffException;
import jxl.write.WriteException;

import org.ufpe.cin.ip.projeto.Dados.BaseClasses.Carta;
import org.ufpe.cin.ip.projeto.Dados.Enums.EnumNaipe;
import org.ufpe.cin.ip.projeto.Dados.Enums.EnumTipoRepositorio;
import org.ufpe.cin.ip.projeto.Dados.Enums.EnumValor;
import org.ufpe.cin.ip.projeto.Dados.Interfaces.Repositorios.IRepositorioCarta;
import org.ufpe.cin.ip.projeto.Dados.Repositorios.RepositorioCartasArquivo;
import org.ufpe.cin.ip.projeto.Dados.Repositorios.RepositorioCartasArray;
import org.ufpe.cin.ip.projeto.Dados.Repositorios.RepositorioCartasLista;
import org.ufpe.cin.ip.projeto.Exceptions.BadFormatObjectInRepository;
import org.ufpe.cin.ip.projeto.Exceptions.ElementNotExistsException;
import org.ufpe.cin.ip.projeto.Exceptions.UnexpectedRepositoryTypeException;

/**
 * DIGITE AQUI!!!
 *  
 * @author phmb3
 */
public class DeckCartas {

	IRepositorioCarta repositorio;

	public DeckCartas(EnumTipoRepositorio enumTipoRepositorio) throws UnexpectedRepositoryTypeException, BiffException, WriteException, IOException {
		if(enumTipoRepositorio.equals(EnumTipoRepositorio.arquivo)){
			this.repositorio = new RepositorioCartasArquivo(); 
		} else if(enumTipoRepositorio.equals(EnumTipoRepositorio.TAD)){
			this.repositorio = new RepositorioCartasLista();
		} else if(enumTipoRepositorio.equals(EnumTipoRepositorio.array)){
			this.repositorio = new RepositorioCartasArray();
		} else {
			throw new UnexpectedRepositoryTypeException();
		}
	}

	public void criarBaralho() throws UnexpectedRepositoryTypeException, WriteException, BiffException, IOException {
		EnumValor valor = null;
		EnumNaipe naipe = null;

		for(int i = 1; i <= 13; i++){
			for(int j = 1; j <= 4 ; j++){
				switch (i) {
				case 1:
					valor = EnumValor.As;
					break;
				case 2:
					valor = EnumValor.Dois;
					break;
				case 3:
					valor = EnumValor.Tres;
					break;
				case 4:
					valor = EnumValor.Quatro;
					break;
				case 5:
					valor = EnumValor.Cinco;
					break;
				case 6:
					valor = EnumValor.Seis;
					break;
				case 7:
					valor = EnumValor.Sete;
					break;
				case 8:
					valor = EnumValor.Oito;
					break;
				case 9:
					valor = EnumValor.Nove;
					break;
				case 10:
					valor = EnumValor.Dez;
					break;
				case 11:
					valor = EnumValor.Valete;
					break;
				case 12:
					valor = EnumValor.Dama;
					break;
				case 13:
					valor = EnumValor.Reis;
					break;
				}
				switch (j) {
				case 1:
					naipe = EnumNaipe.Copas;
					break;
				case 2:
					naipe = EnumNaipe.Espada;
					break;
				case 3:
					naipe = EnumNaipe.Ouro;
					break;
				case 4:
					naipe = EnumNaipe.Paus;
					break;
				}
				repositorio.inserir(new Carta(valor, naipe));
			}
		}		       
	}


	public void embaralhar() throws UnexpectedRepositoryTypeException, WriteException, BiffException, IOException, ElementNotExistsException, BadFormatObjectInRepository {
		int index = 0;
		Carta[] auxArray = new Carta[52];
		Random r = new Random();
		for (int i = 0; i < 52; i++) {
			do{
				index = r.nextInt(52);
			} while(!(auxArray[index] == null));
			
			auxArray[index] = repositorio.procurar(i);
			
		}

		for (int i = 0; i < auxArray.length; i++) {
			repositorio.atualizar(i, auxArray[i]);
		}
	}

	public Carta pegarCarta() throws UnexpectedRepositoryTypeException, BiffException, WriteException, IOException, ElementNotExistsException, BadFormatObjectInRepository {
		Carta carta = repositorio.procurar(0);
		repositorio.remover(0);
		return carta;
	}

	public void destroiBaralho() throws BiffException, WriteException, IOException, ElementNotExistsException {
		for(int i = 0; i < repositorio.length(); i++){
			repositorio.remover(i);
		}
	}
}
